/**
 * 
 */
package edu.umd.clip.lm.model;

import edu.umd.clip.lm.util.*;

/**
 * @author Denis Filimonov <den@cs.umd.edu>
 *
 */
public interface AbstractProbTree {
	/**
	 * tests whether how the cuttingPrefix will cut the tree
	 * @param cuttingPrefix
	 * @return TRUE if the tree is a subtree of the cuttingPrefix, 
	 *         FALSE if there's no intersection between the tree and cuttingPrefix,
	 *         null if the cuttingPrefix can cut the tree (the intersection may still be empty because of pruning)  
	 */
	public Boolean testCut(BinaryPrefix cuttingPrefix);
	/**
	 * Chops a subtree identified by cuttingPrefix off the ProbTree
	 * @param cuttingPrefix
	 * @return the subtree cut, null if nothing has been cut, returns this if all leaves are cut
	 */
	public AbstractProbTree cut(BinaryPrefix cuttingPrefix);
	/**
	 * @return the overtFactors
	 */
	/**
	 * @return the prefix
	 */
	public BinaryPrefix getPrefix();
	/**
	 * @return the cuts
	 */
	public Object clone();
}
